const config = require('../configs.js');

const generateTableFile = () => {
    /**
     * 将下划线命名转为驼峰命名
     */
    const toCamelCase = (str) => {
        return str.toLowerCase().replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
    };

    /**
     * 解析单个表格行（支持动态模式匹配）
     */
    const parseTableLine = (line) => {
        // 跳过注释行（以 // 开头的行）
        if (line.trim().startsWith('//')) return null;

        // 尝试匹配所有配置的模式
        for (const pattern of config.netTablePatterns) {
            // 构建动态正则表达式，匹配类似 COL_COMMON(...) 或 OQC_(...) 的结构
            const regex = new RegExp(`${pattern}\\w*\\s*\\(\\s*(.*?)\\s*,\\s*(.*?)\\s*,\\s*(.*?)\\s*(?:,|\\))`);
            const match = line.match(regex);
            if (!match) continue;

            // 提取三个核心参数
            const [_, labelPart, propPart, widthPart] = match;

            // 解析显示文本（从多语言函数中提取）
            const label = labelPart.replace(/window\.multilang\.pull\(["'](.*?)["']\)/, '$1').replace(/["']/g, '');

            // 解析字段名（转为驼峰）
            const prop = toCamelCase(propPart.replace(/["']/g, ''));

            // 解析列宽（去除px单位）并处理小于等于80的情况
            let width = parseInt(widthPart.replace(/["'px]/g, '')) || 100;
            if (width <= 80) width = 100;

            return {
                props: {
                    prop,
                    width,
                    label: `$t('${label}')`,
                    sortable: true, // 默认值
                    showOverflowTooltip: true, // 默认值
                },
                show: `showColumn(${prop})`, // 直接作为函数调用
            };
        }

        return null; // 没有匹配任何模式
    };

    /**
     * 解析输入数据（支持字符串或数组）
     */
    const parseInput = (input) => {
        if (!input) return [];

        // 统一转为数组处理
        const lines = Array.isArray(input)
            ? input
            : input
                  .split('\n')
                  .map((line) => line.trim())
                  .filter((line) => line);

        return lines.map((line) => parseTableLine(line)).filter(Boolean);
    };

    // 直接生成columns数组代码
    const generateColumnsCode = (columns) => {
        return `[${columns
            .map(
                (col) => `
                {
                    props: {
                        prop: '${col.props.prop}',
                        width: ${col.props.width},
                        label: $t('${col.props.label.replace(/\$t\('(.*?)'\)/, '$1')}'),
                        sortable: ${col.props.sortable},
                        showOverflowTooltip: ${col.props.showOverflowTooltip},
                    },
                    show: showColumn('${col.props.prop}'),
                }`,
            )
            .join(',')}
        ]`;
    };

    // 生成完整代码模板
    return `import { ref } from 'vue';
    import { $t } from 'msct-web-sdk';
    import { ListRow } from '@/types/common';
    import { showColumn } from '@/utils';

    export const useTableConfig = () => {
      const tableColumns = ref(${generateColumnsCode(parseInput(config.netTable))});
      
      const tableData = ref<ListRow[]>([]);

      // 选中的数据
      const tableSelected = ref<ListRow[]>([]);
      const getRowKeys = (row: ListRow) => {
          return row.id;
      };
      const handleSelectionChange = (val: ListRow[]) => {
          tableSelected.value = val;
      };
      const tableHandle = {
          'selection-change': handleSelectionChange,
      };
      const tableProps = ref({
          'row-key': getRowKeys,
          'border': true,
      });

      return {
        tableData,
        tableColumns,
        tableHandle,
        tableProps,
        tableSelected,
      };
    };`;
};

module.exports = {
    generateTableFile,
};
